MySQL タイムゾーン
タイムゾーンの話をここにまとめておく。結構サクッと終わる話だとは思う。
要所を抑えておこう。
「システムタイムゾーン」と「サーバータイムゾーン」
システムタイムゾーン
MySQLが存在するホスト(OS)上のタイムゾーンのこと。
MySQLは起動時に、OSのタイムゾーンをシステムタイムゾーンとして設定する。
サーバータイムゾーン
サーバーの現在のタイムゾーン。
デフォルト値は'SYSTEM'となっており、システムタイムゾーンの値を参照してる。
GLOBALとSESSION
タイムゾーンには、GLOBALとSESSIONが存在する。
GLOBALがデフォルトで全ての接続に適用される値。
SESSIONは、接続ごとに設定される値。もしGLOBALとSESSIONの内容が異なる場合は、SESSIONの方が優先される。
パラメータ変数「time_zone」
タイムゾーンはtimezoneというパラメータから設定する。
ex:SET SESSION time_zone = 'Asia/Tokyo'
タイムゾーンの影響先
NOW()やCURRENT()などのタイムゾーンが影響する関数。
TIMESTAMP型のカラムを取得する際の表示。
TIMESTAMP:全ての時間を(どんなタイムゾーンであろうと)UTCに変換して保存し、読み出す時にはSESSIONに設定されてるタイムゾーンに変換される。
タイムゾーンが影響しない
DATE, DATETIME, TIMEなどの型は実は、タイムゾーンが影響しない。
TIMESTAMPのような柔軟性はなく、普通に固定値で保存してる。
またUTC_TIMESTAMP()などの関数もタイムゾーンが影響しない。
その他Tips
タイムゾーンの変更は、その後の全ての新しい接続に反映される
ただし、変更時に既に開かれていた接続には反映されないので注意。
参考